package org.biubiu0002.baiblog.im.session;

import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.util.AttributeKey;
import lombok.Data;
import org.biubiu0002.baiblog.im.dto.ImUserDto;
import org.biubiu0002.baiblog.im.utils.SpringUtils;

import java.util.UUID;

/**
 * 如果校验成功，设置响应的会话状态；
 * 然后，将会话加入到服务器端的SessionMap映射中，这样该用户就可以接受其他用户发送的聊天信息
 * @Author: biubiu0002
 * @Date: 2022/8/30 0:02
 **/
@Data
public class ServerSession {

    public static final AttributeKey<ServerSession> SESSION_KEY = AttributeKey.valueOf("SESSION_KEY");


    private ImUserDto user;

    private SessionMap sessionMap =(SessionMap) SpringUtils.getBean("sessionMap");

    /**
     * getChannel()正向导航，根据会话信息获取通道实例，以便发送消息
     */
    private Channel channel;

    private Boolean login;
    private String sessionId;


    public ServerSession(){}
    public ServerSession(Channel channel){
        this.channel=channel;
        this.sessionId= UUID.randomUUID().toString().replace("-","");
    }



    /**
     * 反向导航，通过netty上下文 Channel通道获取会话信息 以便完成业务处理逻辑
     * @param ctx 上下文
     * @return 会话信息
     */
    public static ServerSession getSession(ChannelHandlerContext ctx){
        Channel channel = ctx.channel();
        return channel.attr(ServerSession.SESSION_KEY).get();
    }

    public void bind() {
        channel.attr(SESSION_KEY).set(this);
        sessionMap.addSession(sessionId,this);

    }

    public static void closeSession(ChannelHandlerContext ctx){
        ServerSession session = getSession(ctx);
        SessionMap sessionMap = (SessionMap) SpringUtils.getBean("sessionMap");
        if(session!=null){
            sessionMap.removeSession(session.getSessionId());
        }
    }

    public static void closeSession(ServerSession session){
        SessionMap sessionMap = (SessionMap) SpringUtils.getBean("sessionMap");
        if(session!=null){
            sessionMap.removeSession(session.getSessionId());
        }
    }

    public Boolean isLogin(){
        return this.login;
    }
}
